我們之前提到pod可以用node selector來決定特定的pod下要部署到特定的node,但在我們部署pod的時候也會遇到一種情況是「不要部署到其中幾台電腦上」,這時候我們就可以利用 Taints (污點) 和 Toleration(容忍度)來達到我們想做的事情
這部分會分成兩篇,首先先講講 node selector時可能會一併用到的
Affinity
,並帶到 taints 和tolerations的概念,第二天才會講道taints的運用方法
preference
的部分,讓條件有優先度以下為設置的項目
Scheduling
requiredDuringScheduling
:一定要node符合條件才會讓pod部署preferedDuringScheduling
:儘量尋找符合條件的 nodeExecution
IgnoredDuringExecution
:當pod在執行中時,就算node的label被強制更新,也不影響原本部署的pod的運行
RequiredDuringExecution
:當pod在執行中時,node需符合條件,否則會影響原本部署的pod的運行
使用時需把上述 Scheduling
和Execution
的部分合起來,例如 requiredDuringSchedulingIgnoredDuringExecution
,接著寫出條件即可,例如:
requiredDuringSchedulingIgnoredDuringExecution:
# nodeSelector 的條件定義
nodeSelectorTerms:
- matchExpressions:
# node 一定有帶有 以下任何一種 label 才可以
# "kubernetes.io/e2e-az-name=e2e-az1"
# "kubernetes.io/e2e-az-name=e2e-az2"
- key: kubernetes.io/e2e-az-name
operator: In
values:
- e2e-az1
- e2e-az2
e2e-az1
或e2e-az2
」,# 儘量滿足以下條件即可作 pod scheduling
preferredDuringSchedulingIgnoredDuringExecution:
# 這是屬於 prefer 的權重設定(1-100),符合條件就會得到此權重值
# pod 會被分配到最後加總數值最高的 node
- weight: 1
preference:
matchExpressions:
# 儘量尋找帶有 label "another-node-label-key=another-node-label-value" 的 node
- key: another-node-label-key
operator: In
values:
- another-node-label-value
以上為設置pod的優先條件,sceduling時量尋找帶有 label "another-node-label-key=another-node-label-value" 的 node
operator 的部分也還另有 NotIn
, Exists
, DoesNotExist
, Gt
,Lt
等,可以依據需求更換
prefer
的部分可設置1-100的權重值( weight
的部分),會選擇使用計算結果最高的pod進行部署
pod affinity 的功能是在 v1.4 的時候提出,其跟 node affinity 很類似,只是 scheduler 要尋找的是目前有哪些正在運行中的 pod 帶有符合條件的 label set,而不是 node。
規則的設定原則應該是尋找符合條件的 Pod 和其所在的 node 在哪裡,並把 Pod 放到該 node 上面運行
也有兩個類型可以設定:
requiredDuringSchedulingIgnoredDuringExecution
preferredDuringSchedulingIgnoredDuringExecution
preferred...
常與pod 的 anit-affienity配合使用,以分散 pod 在 node 上的配置affinity
和anti-affinity
的部分可以看design-proposals-archive/podaffinity.md at main · kubernetes/design-proposals-archive · GitHub剛講完affinity,就來講講和他完全相反的東西Taints吧
affienty
是用來設置pod應該被部署到哪些的node之中
,taints
則是反其道而行,以其來定義pod 不應該被部署到哪些的 node之中
,並讓scheduler輔以 toleration
來評估並避免pod被分配到不適合的node上
至於如何使用呢,就是明天的東西啦!